package com.dfhc.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import jcifs.smb.NtlmPasswordAuthentication;
import jcifs.smb.SmbFile;
import jcifs.smb.SmbFileOutputStream;

import com.dfhc.ISystemConstant;


/**
 * 访问windows有用户名和密码保护的共享目录方法
 * @author kang
 * */
public class SmbFileUtil {

	/**
	 * 写文件，到有用户名和密码保护的共享目录,传入文件路径
	 * 
	 * @param localUrl 本地文件位置或者上传文件的地址
	 * @param remoteUrl 存放文件的共享目录
	 * @param user  用户名
	 * @param password 密码
	 * @return Map 写入结果信息
	 * */
	public static Map<String, Object> writeSubFile(String localUrl,
			String remoteUrl, String user, String password) {

		Map<String, Object> resultMap = new HashMap<String, Object>();
		if (StringHelper.isEmpty(localUrl)) {
			resultMap.put(ISystemConstant.AJAX_STATUS,ISystemConstant.AJAX_RESULT_FAIL);
			resultMap.put(ISystemConstant.AJAX_MESSAGE, "文件名为空！");
			return resultMap;
		}
		
		try {
			File localfile = new File(localUrl);
			InputStream ins = new FileInputStream(localfile);
			String fileName = localfile.getName();
			
		
			//NtlmPasswordAuthentication需要三个参数， 第一个是域名，没有的话，填null, 第二个是用户名，第三个是密码
			NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("", user, password);
		
			//判断目录是否存在，不存在就创建
			SmbFile smbfilePath  = new SmbFile(remoteUrl,auth);
			if (!smbfilePath.exists()) {
				smbfilePath.mkdirs();
			}
			//写入文件的目录加上文件名
			remoteUrl += fileName;
			SmbFile smbfile = new SmbFile(remoteUrl, auth);
			//验证文件是否已存在
			if (smbfile.exists()) {
				resultMap.put(ISystemConstant.AJAX_STATUS,ISystemConstant.AJAX_RESULT_FAIL);
				resultMap.put(ISystemConstant.AJAX_MESSAGE, "file is exists");
				return resultMap;
			} else {
				smbfile.connect();
				
				OutputStream outs = new SmbFileOutputStream(smbfile);
				byte[] buffer = new byte[4096];
				int len = 0; // 读取长度
				while ((len = ins.read(buffer, 0, buffer.length)) != -1) {
					outs.write(buffer, 0, len);
				}
				outs.flush(); // 刷新缓冲的输出流
			}
			resultMap.put(ISystemConstant.AJAX_STATUS,ISystemConstant.AJAX_RESULT_SUCCESS);
			resultMap.put(ISystemConstant.AJAX_MESSAGE, "写入成功！");
			System.out.println("写入成功");
			return resultMap;
		} catch (Exception e) {
			e.printStackTrace();
			resultMap.put(ISystemConstant.AJAX_STATUS,ISystemConstant.AJAX_RESULT_FAIL);
			resultMap.put(ISystemConstant.AJAX_MESSAGE, e.getMessage());
			return resultMap;
		}
	}
	/**
	 * 写文件，到有用户名和密码保护的共享目录,传入io流
	 * 
	 * @param ins 文件流
	 * @param fileName 文件名
	 * @param remoteUrl 存放文件的共享目录
	 * @param user  用户名
	 * @param password 密码
	 * @return Map 写入结果信息
	 * */
	public static Map<String, Object> writeSubFile(InputStream  ins,
			String fileName,String remoteUrl, String user, String password) {

		Map<String, Object> resultMap = new HashMap<String, Object>();
		if (StringHelper.isEmpty(fileName)) {
			resultMap.put(ISystemConstant.AJAX_STATUS,ISystemConstant.AJAX_RESULT_FAIL);
			resultMap.put(ISystemConstant.AJAX_MESSAGE, "文件为空！");
			return resultMap;
		}
		try {
		
			//NtlmPasswordAuthentication需要三个参数， 第一个是域名，没有的话，填null, 第二个是用户名，第三个是密码
			NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("", user, password);
		
			//判断目录是否存在，不存在就创建
			SmbFile smbfilePath  = new SmbFile(remoteUrl,auth);
			if (!smbfilePath.exists()) {
				smbfilePath.mkdirs();
			}
			//写入文件的目录加上文件名
			remoteUrl += fileName;
			SmbFile smbfile = new SmbFile(remoteUrl, auth);
			//验证文件是否已存在
			if (smbfile.exists()) {
				resultMap.put(ISystemConstant.AJAX_STATUS,ISystemConstant.AJAX_RESULT_FAIL);
				resultMap.put(ISystemConstant.AJAX_MESSAGE, "file is exists");
				return resultMap;
			} else {
				smbfile.connect();
				
				OutputStream outs = new SmbFileOutputStream(smbfile);
				byte[] buffer = new byte[4096];
				int len = 0; // 读取长度
				while ((len = ins.read(buffer, 0, buffer.length)) != -1) {
					outs.write(buffer, 0, len);
				}
				outs.flush(); // 刷新缓冲的输出流
			}
			resultMap.put(ISystemConstant.AJAX_STATUS,ISystemConstant.AJAX_RESULT_SUCCESS);
			resultMap.put(ISystemConstant.AJAX_MESSAGE, "写入成功！");
			return resultMap;
		} catch (Exception e) {
			e.printStackTrace();
			resultMap.put(ISystemConstant.AJAX_STATUS,ISystemConstant.AJAX_RESULT_FAIL);
			resultMap.put(ISystemConstant.AJAX_MESSAGE, e.getMessage());
			return resultMap;
		}
	}
	
	/**
	 * 读文件，获取有用户名和密码保护的共享目录下的文件列表
	 * 
	 * @param remoteUrl 存放文件的共享目录
	 * @param user  用户名
	 * @param password 密码
	 * @return SmbFileList 文件列表
	 * */
	public static List<SmbFile> readSubFileList(String remoteUrl,String user,String password) {
		if(StringHelper.isEmpty(remoteUrl)){
			return null;
		}
		try {
			//NtlmPasswordAuthentication需要三个参数， 第一个是域名，没有的话，填null, 第二个是用户名，第三个是密码
			NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("", user, password);
			SmbFile smbfile = new SmbFile(remoteUrl, auth);
			//验证目录是否存在
			if (!smbfile.exists()) {
				System.out.println("no such folder");
				return null;
			} else {
				List<SmbFile> smbFiles = new ArrayList<SmbFile>();
				SmbFile[] files = smbfile.listFiles();
				for (SmbFile f : files) {
					smbFiles.add(f);
				}
				return smbFiles;
			}
			
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
		
	}
	/**
	 * 读文件，获取有用户名和密码保护的共享目录下的文件
	 * 
	 * @param remoteUrl 共享目录下的文件完整路径
	 * @param user  用户名
	 * @param password 密码
	 * @return SmbFile 文件
	 * */
	public static SmbFile readSubFile(String remoteUrl,String user,String password) {
		if(StringHelper.isEmpty(remoteUrl)){
			return null;
		}
		try {
			//NtlmPasswordAuthentication需要三个参数， 第一个是域名，没有的话，填null, 第二个是用户名，第三个是密码
			NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("", user, password);
			SmbFile smbfile = new SmbFile(remoteUrl, auth);
			//验证目录是否存在
			if (!smbfile.exists()) {
				System.out.println("no such folder");
				return null;
			} else {
				return smbfile;
			}
			
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
		
	}
	
	
	
	/**
	 * 删除文件，删除有用户名和密码保护的共享目录下的文件
	 * 
	 * @param remoteUrl 共享目录下的文件完整路径
	 * @param user  用户名
	 * @param password 密码
	 * @return 删除结果信息
	 * */
	public static Map<String, Object> deleteSubFile(String remoteUrl,String user,String password) {
		Map<String, Object> resultMap = new HashMap<String, Object>();
		if(StringHelper.isEmpty(remoteUrl)){
			resultMap.put(ISystemConstant.AJAX_STATUS,ISystemConstant.AJAX_RESULT_FAIL);
			resultMap.put(ISystemConstant.AJAX_MESSAGE, "文件名为空！");
			return resultMap;
		}
		try {
			
			//NtlmPasswordAuthentication需要三个参数， 第一个是域名，没有的话，填null, 第二个是用户名，第三个是密码
			NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("", user, password);
			SmbFile smbfile = new SmbFile(remoteUrl, auth);
			//验证目录是否存在
			if (!smbfile.exists()) {
				resultMap.put(ISystemConstant.AJAX_STATUS,ISystemConstant.AJAX_RESULT_FAIL);
				resultMap.put(ISystemConstant.AJAX_MESSAGE, "文件不存在");
				return resultMap;
			} else {
				smbfile.delete();
				resultMap.put(ISystemConstant.AJAX_STATUS,ISystemConstant.AJAX_RESULT_SUCCESS);
				resultMap.put(ISystemConstant.AJAX_MESSAGE, "删除成功！");
				return resultMap;
			}
			
		} catch (Exception e) {
			e.printStackTrace();
			resultMap.put(ISystemConstant.AJAX_STATUS,ISystemConstant.AJAX_RESULT_FAIL);
			resultMap.put(ISystemConstant.AJAX_MESSAGE, e.getMessage());
			return resultMap;
		}
		
	}
	
	
	
	public static void main(String[] args) { 
//		writeSubFile("D://QQ.sql", "smb://192.168.1.22/D/", "kang", "123");
		readSubFile("smb://192.168.1.22/D/", "dfhc", "  ");
//		deleteSubFile("smb://192.168.1.14/install/QQ.sql", "dfhc", "  ");
	}
}
